#include "bsp_dht11.h"
#include "bsp_delay.h"

void DHT11_GPIO_MODE_SET(uint8_t mode)
{
    if(mode)
    {

        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.Pin = DHT11_IO_Pin;
        GPIO_InitStruct.Mode =  GPIO_MODE_INPUT;
        GPIO_InitStruct.Pull = GPIO_PULLUP;
        HAL_GPIO_Init(DHT11_IO_Port, &GPIO_InitStruct);
    }
    else 
    {

        GPIO_InitTypeDef GPIO_InitStruct;
        GPIO_InitStruct.Pin = DHT11_IO_Pin;
        GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;
        GPIO_InitStruct.Pull = GPIO_NOPULL;
        GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_HIGH;
        HAL_GPIO_Init(DHT11_IO_Port, &GPIO_InitStruct);
    }
}

void DHT11_START(void)
{
    DHT11_GPIO_MODE_SET(0);                     
    
    DHT11_PIN_RESET;                         
    
    HAL_Delay(20);                                 
    
    DHT11_GPIO_MODE_SET(1);                        
}                                             
 

unsigned char DHT11_READ_BIT(void)
{
    while(!DHT11_READ_IO);                        
    
    delay_us(40);
 
    if(DHT11_READ_IO)                              
    {
        while(DHT11_READ_IO);                      
        return 1;
    }   
    else                                          
    {
        return 0;
    }
}
 

unsigned char DHT11_READ_BYTE(void)
{
    uint8_t i,temp = 0;                            
    
    for(i=0; i<8 ;i++)
    {
        temp <<= 1;                                 
        if(DHT11_READ_BIT())                        //  1byte -> 8bit
        {
            temp |= 1;                              //  0000 0001
        }
    }
    return temp;
}

unsigned char DHT11_Check(void)
{
 
    delay_us(40);
    if(DHT11_READ_IO == 0)                        
    {
        return 1;
    }
    else                                          
    {
        return 0;
    }
}

void DHT11_Init(void)
{
	HAL_Delay(100);
  	DHT11_START();                                 
    HAL_Delay(1000);                              
}
